/*
 * Manejador_Agentes.cpp
 *
 *  Created on: 06/06/2012
 *      Author: sebastian
 */

#include "Manejador_Agentes.h"
#include "Recibidor_Agente.h"
#include <list>

Manejador_Agentes::Manejador_Agentes(std::string puerto, Servidor& servidor) : socket_agentes(puerto.c_str()), server(servidor) {
}

Manejador_Agentes::~Manejador_Agentes() {
}

void Manejador_Agentes::run() {
	socket_agentes.enlazar();
	socket_agentes.escuchar();
	std::list<Recibidor_Agente*> agentes;
	while(isRunning()) {
		int fd = socket_agentes.aceptar();
		if(fd < 0)
			stop();
		else {
			Recibidor_Agente* ra = new Recibidor_Agente(socket_agentes.getPuerto(), fd, server);
			agentes.push_back(ra);
			ra->start();
		}
		std::list<Recibidor_Agente*>::iterator it;
		for(it = agentes.begin(); it != agentes.end();) {
			Recibidor_Agente* r_aux = *it;
			if(!(r_aux->isRunning())) {
				r_aux->join();
				it = agentes.erase(it);
				delete r_aux;
			} else
				++it;
		}
	}
	std::list<Recibidor_Agente*>::iterator it;
	for(it = agentes.begin(); it != agentes.end();) {
		Recibidor_Agente* r_aux = *it;
		r_aux->stop();
		r_aux->cerrar();
		r_aux->join();
		it = agentes.erase(it);
		delete r_aux;
	}
}

void Manejador_Agentes::cerrar() {
	socket_agentes.cerrar();
}
